package com.gshg.log.cleanlog.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Date;

@Slf4j
public class FileUtil {

   final static String DATE_FORMAT = "yyyy-MM-dd";

    /**
     * 返回文件名包含filter值的文件数组
     * @param fileDir
     * @param filter
     * @return
     */
    public static  File[] getFiles(File fileDir, final String... filter){
        // 1.判断该路径是否存在，如果存在，是否为一个目录
        if (!fileDir.exists() && !fileDir.isDirectory()) {
            throw new RuntimeException("要过滤file不存在，或者不是一个文件夹");
        }
        // 2.过滤文件名包含filter字符串的文件
        File[] files = fileDir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                boolean res = true;
                for(String strFilter : filter){
                    if(!name.contains(strFilter)){
                        res = false;
                        break;
                    }
                }

                return res;
            }
        });

        return files;
    }


    /**
     * 根据条件获取相应的日志文件
     * 返回文件名包含日期格式（yyyy-MM-dd），并且按照文件名前缀（{fileNamePrefix}）进行过滤，并且文件名日期在当前日期前{retainDay}天之前的日志文件
     * @param fileDir           日志文件路径
     * @param fileNamePrefix   日志文件前缀，可为空，为空时对路径下的所有文件进行筛选
     * @param retainDay
     * @return
     */
    public static  File[] getFiles(File fileDir, final String fileNamePrefix, final String fileNameTemplate,  final int retainDay){
        // 1.判断该路径是否存在，如果存在，是否为一个目录
        if (!fileDir.exists() && !fileDir.isDirectory()) {
            throw new RuntimeException("要过滤file不存在，或者不是一个文件夹");
        }

        // 2.过滤文件名包含filter字符串的文件
        File[] files = fileDir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                Date retainLogStartDay = DateUtil.getDateBeforeSomeDate(new Date(), -retainDay);
                int templateStart = 0;
                int templateEnd = 0;

                boolean res = true;
                String filaNameDate = "";
                if(StringUtils.isNotEmpty(fileNamePrefix) ){
                    if(!name.contains(fileNamePrefix) || !fileNameTemplate.contains(DATE_FORMAT) || name.length()<(fileNamePrefix.length()+DATE_FORMAT.length())){
                        return false;
                    }
                    int tepIndex = fileNameTemplate.indexOf(DATE_FORMAT);
                    templateStart = tepIndex;
                    templateEnd = tepIndex+DATE_FORMAT.length();
                    filaNameDate = FileNameDealUtils.getFileContainDate(name, templateStart, templateEnd);
                }else {
                    filaNameDate = FileNameDealUtils.getFileContainDate(name, DATE_FORMAT);
                }

                if(StringUtils.isEmpty(filaNameDate)){
                    return false;
                }
                try {
                    Date logFileDate = DateUtil.stringParseDate(filaNameDate, DATE_FORMAT);
                    if(null == logFileDate || null == retainLogStartDay){
                        res = false;
                    }else{
                        if(logFileDate.after(retainLogStartDay)){
                            res = false;
                        }else{
                            res = true;
                        }
                    }
                }catch (Exception e){
                    log.error(e.getLocalizedMessage(), e);
                    res = false;
                }

                return res;
            }
        });

        return files;
    }
}
